#include <iostream>
#include <string>
#include "39OOP-usingClass.hpp"
// class destructor 析构函数
// 用于: 生命周期结束时释放对象
// 析构函数（Destructor）也是一种特殊的成员函数，没有返回值，不需要程序员显式调用（程序员也没法显式调用），而是在销毁对象时自动执行。
// 构造函数的名字和类名相同，而析构函数的名字是在类名前面加一个~符号。

// 注意：析构函数没有参数，不能被重载，因此一个类只能有一个析构函数。如果用户没有定义，编译器会自动生成一个默认的析构函数!!!!!!!!!
// ~DefineAClass();    // 析构函数的声明应该是这样的
// 为了看到析构函数工作的时候的样子,我们显示的让他说一句话
DefineAClass::~DefineAClass()
{
    using std::cout;
    using std::endl;
    cout << "bye!! DefineAClass is destroyed!" << endl;
}
// 什么时候应该调用析构函数呢?   这个由编译器决定,通常不应该在代码中显示的调用析构函数(当然也有例外)
// 如果创建的是静态存储类对象，则其析构函数将在程序结束时自动被调用。
// 如果创建的是自动存储类对象，则其虚构函数将在程序执行完代码块时(该对象是在其中定义的)自动被调用。
// 如果对象是通过new创建的，则枪则它将驻留在栈内存或自由存储区中，当使用delete来释放内存时，其析构函数将自动被调用。
// 最后程序可以创建临时对象来完成特定的操作，在这种情况下，程序将在结束对该对象的自动使用时自动调用其机构函数。

// g++ -Wall -g .\39OOP-usingClass.cpp .\39OOP-usingClass.hpp .\39UsingDefineAClass.cpp .\41classDestructor.cpp .\40classConstructors.cpp -o .\41classDestructor.exe -std=c++17